package kernel.stl;

import java.util.ArrayList;
import kernel.stl.exception.InvalidScaleException;

/**
 * Um sólido consiste de um conjunto de facets (triângulos) que dão forma ao objeto.
 * @author George
 */
public class Solid {

    private ArrayList facets;
    private String name;

    public Solid(String solidName) {
        facets = new ArrayList();
    }

    public void changeScale(double scale) {
        if (scale <= 0) {
            System.out.println("Escala inválidia");
            return;
        }
        
        try {
            for (int i = 0; i < this.getFacetCount(); i++) {
                Facet facet = this.getFacet(i);
                facet.changeScale(scale);
            }
        } catch (InvalidScaleException exception) {
            System.out.println("Escala inválida");
        }
    }

    public void exchangeXYAxis() {
        for (int i = 0; i < this.getFacetCount(); i++)
            this.getFacet(i).exchangeXYAxis();
    }
    
    public void exchangeXZAxis() {
        for (int i = 0; i < this.getFacetCount(); i++)
            this.getFacet(i).exchangeXZAxis();
    }
        
    public void exchangeYZAxis() {
        for (int i = 0; i < this.getFacetCount(); i++)
            this.getFacet(i).exchangeYZAxis();
    }
    
    public void addFacet(Facet facet) {
        this.facets.add(facet);
    }

    public String getName() {
        return this.name;
    }

    public int getFacetCount() {
        return facets.size();
    }

    public Facet getFacet(int facetIndex) {
        return (Facet) facets.get(facetIndex);
    }

    public double getMaxX() {
        //lançar uma exceção caso não exista nenhuma facet.
        Facet facet = this.getFacet(0);
        double maximum = facet.getMaxX();

        for (int i = 1; i < this.getFacetCount(); i++) {
            facet = this.getFacet(i);
            if (facet.getMaxX() > maximum) {
                maximum = facet.getMaxX();
            }
        }

        return maximum;
    }

    public double getMinX() {
        //lançar uma exceção caso não exista nenhuma facet.
        Facet facet = this.getFacet(0);
        double minimum = facet.getMinX();

        for (int i = 1; i < this.getFacetCount(); i++) {
            facet = this.getFacet(i);
            if (facet.getMinX() < minimum) {
                minimum = facet.getMinX();
            }
        }

        return minimum;
    }

    public double getMaxY() {
        //lançar uma exceção caso não exista nenhuma facet.
        Facet facet = this.getFacet(0);
        double maximum = facet.getMaxY();

        for (int i = 1; i < this.getFacetCount(); i++) {
            facet = this.getFacet(i);
            if (facet.getMaxY() > maximum) {
                maximum = facet.getMaxY();
            }
        }

        return maximum;
    }

    public double getMinY() {
        //lançar uma exceção caso não exista nenhuma facet.
        Facet facet = this.getFacet(0);
        double minimum = facet.getMinY();

        for (int i = 1; i < this.getFacetCount(); i++) {
            facet = this.getFacet(i);
            if (facet.getMinY() < minimum) {
                minimum = facet.getMinY();
            }
        }

        return minimum;
    }

    public double getMaxZ() {
        //lançar uma exceção caso não exista nenhuma facet.
        Facet facet = this.getFacet(0);
        double maximum = facet.getMaxZ();

        for (int i = 1; i < this.getFacetCount(); i++) {
            facet = this.getFacet(i);
            if (facet.getMaxZ() > maximum) {
                maximum = facet.getMaxZ();
            }
        }

        return maximum;
    }

    public double getMinZ() {
        //lançar uma exceção caso não exista nenhuma facet.
        Facet facet = this.getFacet(0);
        double minimum = facet.getMinZ();

        for (int i = 1; i < this.getFacetCount(); i++) {
            facet = this.getFacet(i);
            if (facet.getMinZ() < minimum) {
                minimum = facet.getMinZ();
            }
        }

        return minimum;
    }
    
}
